package com.secsys.action.price;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.secsys.action.BaseAction;
import com.secsys.dto.AssistDto;
import com.secsys.dto.StoStockDTO;
import com.secsys.dto.StoStockdailyDTO;
import com.secsys.model.TbStoStock;
import com.secsys.model.TbStoStockdaily;
import com.secsys.service.StoStockService;
import com.secsys.service.StoStockdailyService;
import com.secsys.util.DateFormatUtils;
/**
 * 处理股票日线数据（股价分析）相关的Action，比如
 * <pre>
 * 1.处理功能（股价分析）:
 * (1).股价小工具（按照时间、升降幅度）：
 * 		prepareStockPrice、searchStockPrice、stockPriceDetail、doStockPriceSearch分别为默认处理、用户搜索、详细信息、内部协助函数。
 *@作者 tiger.hu.tiger@gmail.com
 *@创建日期 2011-5-8
 *@版本1.0
 */
public class StockDailyAction extends BaseAction<TbStoStockdaily> {

	private static final long serialVersionUID = 2967798489668008985L;
	private TbStoStockdaily tbStoStockdaily;
	private List<StoStockdailyDTO> startStockdailyDTOList;
	private List<StoStockdailyDTO> endStoStockdailyDTOList; 
	private List<StoStockDTO> stockDTOAssistList; 
	
	private List<StoStockdailyDTO> stoStockdailyDTOList;
	private List<StoStockdailyDTO> oldYearStoStockdailyDTOList;
	private List<StoStockDTO> stockDTOList;

	
	
	
	private AssistDto assistDto; 
	private StoStockDTO stockDTO;
	private StoStockService stoStockService;
	private StoStockdailyService stoStockdailyService; 
	
	/**
	 * 规定分页大小为10
	 */
	private final int limit=10; 
	
	
	/**
	 * 股价分析中股价小工具（按照时间、升降幅度）,默认处理、初始化处理
	 * @return
	 * @throws Exception
	 */
	public String prepareStockPrice()throws Exception{
		if (assistDto==null) {
			assistDto=new AssistDto();
		}
		assistDto.setStartDate(DateFormatUtils.convertStringToDate("1997-6-3"));
		assistDto.setEndDate(stoStockdailyService.findLastDate());
		assistDto.setRate(5);
		assistDto.setUpdown(1);
		assistDto.setCurrentPages(0);
		assistDto.setTotalPages(0);
		
		this.searchStockPrice();
		
		return "search";
	}
	/**
	 * 股价分析中股价小工具（按照时间、升降幅度），用户搜索
	 * @return
	 * @throws Exception
	 */
	public String searchStockPrice()throws Exception{
		System.out.println("dosearch "+assistDto.getStartDate()+" end:"+assistDto.getEndDate()); 
		List<StoStockdailyDTO> tempStartList=this.stoStockdailyService.queryStoStockdailyByDate(assistDto.getStartDate(),0,0,1);
		Date startDate=null,endDate=null;
		/**
		 * 查询最近日期的一条数据，设置开始、结束时间
		 */
		System.out.println(tempStartList.size()+"-tempStartList--size");
		if (null!=tempStartList && tempStartList.size()>=1) {
			StoStockdailyDTO tempStart=tempStartList.get(0);
			startDate=DateFormatUtils.convertStringToDate(DateFormatUtils.convertDateToString(tempStart.getOperateDate())); 
		}
		List<StoStockdailyDTO> tempEndList=this.stoStockdailyService.queryStoStockdailyByDate(assistDto.getEndDate(),0,0,1);
		
		if (null!=tempEndList && tempEndList.size()>=1) {
			StoStockdailyDTO tempEnd=tempEndList.get(0);
			endDate=DateFormatUtils.convertStringToDate(DateFormatUtils.convertDateToString(tempEnd.getOperateDate())); 
		} 
		
		//1.列出所有个股 ,按照ID升序排序
		String sql=null;
		List<TbStoStock> stockList=null;

		sql="from TbStoStock order by id asc";
		stockList=stoStockService.findByHql(sql); 
		HashMap<Integer, TbStoStock> stockMap=new HashMap<Integer, TbStoStock>();  
		for (TbStoStock tbStoStock : stockList) {
			stockMap.put(tbStoStock.getId(), tbStoStock);
		}
		
		List<TbStoStockdaily> startDailyList=stoStockdailyService.findByProperty("from TbStoStockdaily where operateDate=?",startDate);
		List<TbStoStockdaily> endDailyList=stoStockdailyService.findByProperty("from TbStoStockdaily where operateDate=?",endDate);
		HashMap<Integer, TbStoStockdaily> endMap=new HashMap<Integer, TbStoStockdaily>(); 
		for (TbStoStockdaily tbStoStockdaily : endDailyList) { 
			endMap.put(tbStoStockdaily.getTbStoStock().getId(), tbStoStockdaily);
		}
		startStockdailyDTOList=new ArrayList<StoStockdailyDTO>();
		endStoStockdailyDTOList=new ArrayList<StoStockdailyDTO>();
		stockDTOAssistList=new ArrayList<StoStockDTO>();
		//包含所有符合的日线数据stockDTOList
		for (TbStoStockdaily tbStoStockdaily : startDailyList) { 
			if (endMap.get(tbStoStockdaily.getTbStoStock().getId())!=null) { 
				TbStoStockdaily endTbStoStockdaily=endMap.get(tbStoStockdaily.getTbStoStock().getId());
				double temp=(endTbStoStockdaily.getEndPrice()-tbStoStockdaily.getEndPrice())*100/tbStoStockdaily.getEndPrice();
				if (assistDto.getUpdown()==1) {
					//上涨
					if (temp>Double.valueOf(assistDto.getRate())) { 
						int stockID=tbStoStockdaily.getTbStoStock().getId();
						startStockdailyDTOList.add(new StoStockdailyDTO(tbStoStockdaily));
						endStoStockdailyDTOList.add(new StoStockdailyDTO(endTbStoStockdaily));
						StoStockDTO temStockDTO=new StoStockDTO(stockMap.get(stockID));
						stockDTOAssistList.add(temStockDTO);
					}
				}else {
					if (temp<Double.valueOf(assistDto.getRate()) && temp>0) {
						int stockID=tbStoStockdaily.getTbStoStock().getId();
						startStockdailyDTOList.add(new StoStockdailyDTO(tbStoStockdaily));
						endStoStockdailyDTOList.add(new StoStockdailyDTO(endTbStoStockdaily));
						StoStockDTO temStockDTO=new StoStockDTO(stockMap.get(stockID));
						stockDTOAssistList.add(temStockDTO);
					}
				}
			} 
		} 
		this.session.put("assistDto",assistDto  );
		this.session.put("endStoStockdailyDTOList",endStoStockdailyDTOList  );
		this.session.put("endStoStockdailyDTOList",endStoStockdailyDTOList  );
		this.session.put("stockDTOAssistList",stockDTOAssistList  );
		System.out.println("searchStockPrice---: stockDTOAssistList==null--"+(stockDTOAssistList==null));
		if (assistDto==null) {
			assistDto.setCurrentPages(1);
		}
//		this.searchStockPricePages();
		
		stockDTOList=new ArrayList<StoStockDTO>();
		stoStockdailyDTOList=new ArrayList<StoStockdailyDTO>();
		oldYearStoStockdailyDTOList=new ArrayList<StoStockdailyDTO>();
		//总数
		if (0 >= assistDto.getCurrentPages()) {
			assistDto.setCurrentPages(1);
		}
		
		int num=stockDTOAssistList.size(); 
		int size=num-(assistDto.getCurrentPages()-1)*limit;
		if (size<0) {
			size=-size;
		}
		size=size>limit?limit:size;
		int offset = (assistDto.getCurrentPages() -1) * limit;
		
		
		for (int i=0;i<size;i++) {
			StoStockDTO stockDTO=stockDTOAssistList.get(i+offset);
			stockDTOList.add(stockDTO);
			stoStockdailyDTOList.add(startStockdailyDTOList.get(i+offset ));
			oldYearStoStockdailyDTOList.add(endStoStockdailyDTOList.get(i+offset ));
		}
		/**
		 * 总共多少页
		 */
		int totalPages = (num / limit);
		
		if (num % limit > 0) {
			totalPages++;
		}
		assistDto.setTotalPages(totalPages);
		
		return "search";
	}
	
	
	public String searchStockPricePages() throws Exception{
		stockDTOAssistList=(List<StoStockDTO>)session.get("stockDTOAssistList");
		startStockdailyDTOList=(List<StoStockdailyDTO>)session.get("startStockdailyDTOList");
		endStoStockdailyDTOList=(List<StoStockdailyDTO>)session.get("endStoStockdailyDTOList");
		System.out.println("searchStockPricePages :stockDTOAssistList==null---"+(stockDTOAssistList==null));
		stockDTOList=new ArrayList<StoStockDTO>();
		stoStockdailyDTOList=new ArrayList<StoStockdailyDTO>();
		oldYearStoStockdailyDTOList=new ArrayList<StoStockdailyDTO>();
		//总数
		if (0 >= assistDto.getCurrentPages()) {
			assistDto.setCurrentPages(1);
		}
		
		int num=stockDTOAssistList.size(); 
		int size=num-(assistDto.getCurrentPages()-1)*limit;
		if (size<0) {
			size=-size;
		}
		size=size>limit?limit:size;
		int offset = (assistDto.getCurrentPages() -1) * limit;
		
		for (int i=0;i<size;i++) {
			StoStockDTO stockDTO=stockDTOAssistList.get(i+offset);
			stockDTOList.add(stockDTO);
			stoStockdailyDTOList.add(startStockdailyDTOList.get(i+offset ));
			oldYearStoStockdailyDTOList.add(endStoStockdailyDTOList.get(i+offset ));
		}
		/**
		 * 总共多少页
		 */
		int totalPages = (num / limit);
		
		if (num % limit > 0) {
			totalPages++;
		}
		assistDto.setTotalPages(totalPages);
		return "search";
	}
	
	
	/**
	 * 股价分析中股价小工具（按照时间、升降幅度）,详细信息显示
	 * @return
	 * @throws Exception
	 */
	public String stockPriceDetail()throws Exception{
		assistDto=(AssistDto)session.get("assistDto");
		stockDTO=stoStockService.findByStockCode(stockDTO.getStockCode());
		if (0 == assistDto.getCurrentPages()) {
			assistDto.setCurrentPages(1);
		}
		int offset = (assistDto.getCurrentPages() - 1) * 20;
		int num=stoStockdailyService.countByStockCode(stockDTO.getStockCode()); 
		int totalPages = (num / 20);
		if (num % 20 > 0) {
			totalPages++;
		}
		
		if (assistDto.getCurrentPages() >totalPages) {
			assistDto.setCurrentPages(1); 
		}
		System.out.println(totalPages+"总页数");
		assistDto.setTotalPages(totalPages);
		this.stoStockdailyDTOList=stoStockdailyService.queryStoStockdailyByStockCode(stockDTO.getStockCode(),offset,20);
		return "detail";
	}
	
	
	@Override
	public TbStoStockdaily getModel() {
		if (this.tbStoStockdaily==null) {
			tbStoStockdaily=new TbStoStockdaily();
		}
		return this.tbStoStockdaily;
	}
	public TbStoStockdaily getTbStoStockdaily() {
		return tbStoStockdaily;
	}
	public void setTbStoStockdaily(TbStoStockdaily tbStoStockdaily) {
		this.tbStoStockdaily = tbStoStockdaily;
	}
	public List<StoStockdailyDTO> getStartStockdailyDTOList() {
		return startStockdailyDTOList;
	}
	public void setStartStockdailyDTOList(
			List<StoStockdailyDTO> startStockdailyDTOList) {
		this.startStockdailyDTOList = startStockdailyDTOList;
	}
	public List<StoStockdailyDTO> getEndStoStockdailyDTOList() {
		return endStoStockdailyDTOList;
	}
	public void setEndStoStockdailyDTOList(
			List<StoStockdailyDTO> endStoStockdailyDTOList) {
		this.endStoStockdailyDTOList = endStoStockdailyDTOList;
	}
	public List<StoStockDTO> getStockDTOAssistList() {
		return stockDTOAssistList;
	}
	public void setStockDTOAssistList(List<StoStockDTO> stockDTOAssistList) {
		this.stockDTOAssistList = stockDTOAssistList;
	}
	public List<StoStockdailyDTO> getStoStockdailyDTOList() {
		return stoStockdailyDTOList;
	}
	public void setStoStockdailyDTOList(List<StoStockdailyDTO> stoStockdailyDTOList) {
		this.stoStockdailyDTOList = stoStockdailyDTOList;
	}
	public List<StoStockdailyDTO> getOldYearStoStockdailyDTOList() {
		return oldYearStoStockdailyDTOList;
	}
	public void setOldYearStoStockdailyDTOList(
			List<StoStockdailyDTO> oldYearStoStockdailyDTOList) {
		this.oldYearStoStockdailyDTOList = oldYearStoStockdailyDTOList;
	}
	public List<StoStockDTO> getStockDTOList() {
		return stockDTOList;
	}
	public void setStockDTOList(List<StoStockDTO> stockDTOList) {
		this.stockDTOList = stockDTOList;
	}
	public AssistDto getAssistDto() {
		return assistDto;
	}
	public void setAssistDto(AssistDto assistDto) {
		this.assistDto = assistDto;
	}
	public StoStockDTO getStockDTO() {
		return stockDTO;
	}
	public void setStockDTO(StoStockDTO stockDTO) {
		this.stockDTO = stockDTO;
	}
	public StoStockService getStoStockService() {
		return stoStockService;
	}
	public void setStoStockService(StoStockService stoStockService) {
		this.stoStockService = stoStockService;
	}
	public StoStockdailyService getStoStockdailyService() {
		return stoStockdailyService;
	}
	public void setStoStockdailyService(StoStockdailyService stoStockdailyService) {
		this.stoStockdailyService = stoStockdailyService;
	}

}
